/**
 * @description 验证类
 * @author xiaodong.zhang
 * @example
 * import data from './Date'
 * this.$jxUtils.date.getTimeStamp(2021-09-10 23:00:20) // 转换时间戳
 * this.$jxUtils.date.dateFmt('yyyy-MM-dd hh:mm:ss','1631286020000') //2021-09-10 23:00:20
 * this.$jxUtils.date.dateAdd("h", 1) // 返回一小时后时间戳
 * this.$jxUtils.date.latelyDate(7) // 最近7天时间段 [2021-08-10,2021-08-17]
 * this.$jxUtils.date.transLocalTimeBjTime('2015-05-09 11:29:23') // 返回转换后的北京时间
 * this.$jxUtils.date.transBjTimeLocalTime('2015-05-09 11:29:23') // 把北京时间转换为当地时间
 * ...
 *
 */
class JxValidator {
  constructor() {}

  /**
   * @description 是否是整数
   * @param {string} str
   * @returns {boolean} true false
   * @author xiaodong.zhang
   * @example
   * this.$jxUtils.validator.isInt('a') //false
   * this.$jxUtils.validator.isInt('1') //true
   * this.$jxUtils.validator.isInt('-1') //true
   */
  isInt(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^[-\+]?\d+$/)
    if (result == null) return false
    return true
  }
  /**
   * @description 是否是浮点数
   * @param {string} str
   * @returns {boolean} true false
   * @author xiaodong.zhang
   * @example
   * this.$jxUtils.validator.isFloat('a') //false
   * this.$jxUtils.validator.isFloat('0.1') //true
   * this.$jxUtils.validator.isFloat('1') //false
   * this.$jxUtils.validator.isFloat('-1') //false
   * this.$jxUtils.validator.isFloat('-1.5') //true
   */
  isFloat(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^[-\+]?\d+(\.\d+)$/)
    if (result == null) return false
    return true
  }
  /**
   * @description 判断字符船长度区间
   * @param {string} str 目标字符串
   * @param {number} minLenth  最小
   * @param {number} maxLength 最大
   * @author xiaodong.zhang
   * @returns {boolean} true false
   * @example
   * this.$jxUtils.validator.isLessThan('abc',5,8)  //false
   * this.$jxUtils.validator.isLessThan('defage',5,8)  //true
   * this.$jxUtils.validator.isLessThan('defage',5)  //false
   *
   */
  isLessThan(str, minLenth = 0, maxLength) {
    str = String(str)

    if (str == null || str == '') return false
    if (maxLength) {
      return str.length <= maxLength && str.length >= minLenth
    } else {
      return str.length >= minLenth
    }
  }

  /**
   * @description 给出目标判断是否为 数字
   * @param {string} str 目标字符传
   * @author xiaodong.zhang
   * @returns {boolean} true false
   * @example
   * this.$jxUtils.validator.isNumber('defage') //false
   * this.$jxUtils.validator.isNumber('10') //true
   * this.$jxUtils.validator.isNumber('10.3') //true
   * this.$jxUtils.validator.isNumber('-10') //true
   * this.$jxUtils.validator.isNumber('-10.4') //true
   */
  isNumber(str) {
    if (this.isFloat(str) || this.isInt(str)) return true
    return false
  }

  /**
   * @description 验证邮箱
   * @param {string}} str 目标字符串
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * this.$jxUtils.validator.isEmail('4494223@qq.com') // true
   * this.$jxUtils.validator.isEmail('449422.com') // false
   *
   */
  isEmail(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/)
    if (result == null) return false
    return true
  }
  /**
   * @description 验证手机号
   * @param {string} str 目标字符串
   * @param {boolean} i18n 是否为国际手机号 可选 1/true 是  0/false 否
   * @author xiaodong.zhang
   * @returns {boolean} true / false
   * @example
   * this.$jxUtils.validator.isPhone('156000774926') //true
   * this.$jxUtils.validator.isPhone('15600077') //false
   * this.$jxUtils.validator.isPhone('15600077',1) //true
   * this.$jxUtils.validator.isPhone('1560',1) //false
   */
  isPhone(str, i18n) {
    str = String(str)
    if (str == null || str == '') return false
    let result = !i18n ? str.match(/^1(3|4|5|6|7|8|9)\d{9}$/) : str.match(/\d{5,20}/)
    if (result == null) return false
    return true
  }
  /**
   * @description 验证是否为url
   * @param {string} str url地址
   * @author xiaodong.zhang
   * @returns {boolean} true/ false
   * @example
   * this.$jxUtils.validator.isURL('http://www.baidu.com') // true
   * this.$jxUtils.validator.isURL('https://www.baidu.com') // true
   * this.$jxUtils.validator.isURL('htt://www.baidu.com') // false
   */
  isURL(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^https?:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\’:+!]*([^<>\"])*$/)
    if (result == null) return false
    return true
  }
  /**
   * @description 验证空字符串
   * @param {string} str 目标字符串
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * let arr = ''
   * let arr1 = 'abc'
   * this.$jxUtils.validator.isEmpty(arr) // true
   * this.$jxUtils.validator.isEmpty(arr1) // false
   */
  isEmpty(str) {
    return str == null || str == '' ? true : false
  }
  /**
   * @description 验证非空字符
   * @param {string} str
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * let arr = ''
   * let arr1 = 'abc'
   * this.$jxUtils.validator.isNotEmpty(arr) // false
   * this.$jxUtils.validator.isNotEmpty(arr1) // true
   */
  isNotEmpty(str) {
    return !this.isEmpty(str)
  }
  /**
   * @description 手机验证码
   * @param {string} str 目标字符
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * this.$jxUtils.validator.isPhoneValidator('453121') // true
   * this.$jxUtils.validator.isPhoneValidator('45312') // false
   *
   */
  isPhoneValidator(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^\d{6}$/)
    if (result == null) return false
    return true
  }

  /**
   * @description 验证是否是中文
   * @param {string} str  目标字符
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * this.$jxUtils.validator.isZh('你好') // true
   * this.$jxUtils.validator.isZh('hello') // false
   *
   */

  isZh(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^[\u4e00-\u9fa5]+$/)
    if (result == null) return false
    return true
  }

  /**
   * @description 验证英文
   * @param {string} str  目标字符串
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * this.$jxUtils.validator.isTime('helo') // true
   * this.$jxUtils.validator.isTime('你好李焕英') // false
   */
  isEn(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^[A-Za-z]+$/)
    if (result == null) return false
    return true
  }

  /**
   * @description 验证是否为时间
   * @param {string} str 目标字符串
   * @returns {boolean} true / false
   * @example
   * this.$jxUtils.validator.isTime('11:20') // true
   * this.$jxUtils.validator.isTime('11:20:20') // true
   * this.$jxUtils.validator.isTime('11-20:20') // false
   */
  isTime(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^\d+:[0-5]?[0-9](:[0-5]?[0-9])?$/)
    if (result == null) return false
    return true
  }

  /**
   * @description 验证是否为日期 （暂时验证时间格式 不验证时间合法性）
   * @param {string} str 目标字符串
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * this.$jxUtils.validator.isDate('2020-09-12') // true
   * this.$jxUtils.validator.isDate('202000') // false
   *
   */
  isDate(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^\d{4}-\d{2}-\d{2}$/)
    if (result == null) return false
    return true
  }
  /**
   * @description 验证是否为 日期时间 （暂时验证时间格式 不验证时间合法性）
   * @param {string} str
   * @author xiaodong.zhang
   * @returns {boolean}
   * @example
   * this.$jxUtils.validator.isDateTime('2021-09-30 12:00:01') //true
   * this.$jxUtils.validator.isDateTime('2021-09-30 12:00') //true
   * this.$jxUtils.validator.isDateTime('2021-09-30') //false
   *
   */
  isDateTime(str) {
    str = String(str)
    if (str == null || str == '') return false
    let result = str.match(/^\d{4}-\d{2}-\d{2}\s\d+:[0-5]?[0-9](:[0-5]?[0-9])?$/)
    if (result == null) return false
    return true
  }
  /**
   * @description 验证是否为 字母数字组合 可选是否有 下划线 '_' 中划线'-' （加入可配置特殊字符）
   * @param {string} str 目标字符串
   * @param {boolean} hasUM 是否包含 下划线 '_' 中划线'-'
   * @author xiaodong.zhang
   * @returns {boolean} true false
   * @example
   * this.$jxUtils.validator.isChat('@#23aaab') //false
   * this.$jxUtils.validator.isChat('112231') //true
   * this.$jxUtils.validator.isChat('112231----____') //false
   * this.$jxUtils.validator.isChat('112231----____',1) //true
   */
  isChat(str, hasUM) {
    str = String(str)
    if (str == null || str == '') return false
    let result = !hasUM ? str.match(/^[a-zA-Z0-9]+$/) : str.match(/^[a-zA-Z0-9_-]+$/)
    if (result == null) return false
    return true
  }
  /**
   * @description 验证是否为对象 {} 字符串对象 key 需要加 ""
   * @param {object} obj 目标对象
   * @author xiaodong.zhang
   * @returns {boolean} true /false
   * @example
   * this.$jxUtils.validator.isObject({}) // true
   * this.$jxUtils.validator.isObject('{"a":1}') // true
   * this.$jxUtils.validator.isObject([1,2]) // false
   * this.$jxUtils.validator.isObject(1) false
   */
  isObject(obj) {
    let temp = null
    if (typeof obj == 'string') {
      try {
        temp = JSON.parse(obj)
      } catch (error) {
        // console.error(error)
        return false
      }
    } else {
      temp = obj
    }
    return temp && typeof temp == 'object' && Object.prototype.toString.call(temp).toLowerCase() == '[object object]'
  }
  /**
   * @description 验证是否为数组 []
   * @param {object} {string} obj 目标对象
   * @author xiaodong.zhang
   * @returns {boolean} true /false
   * @example
   * this.$jxUtils.validator.isArray({}) // false
   * this.$jxUtils.validator.isArray({a:1}) // false
   * this.$jxUtils.validator.isArray([1,2]) // true
   * this.$jxUtils.validator.isArray(1) false
   */
  isArray(obj) {
    let temp = null
    if (typeof obj == 'string') {
      try {
        temp = JSON.parse(obj)
      } catch (error) {
        // console.error(error)
        return false
      }
    } else {
      temp = obj
    }
    return temp && typeof temp == 'object' && Object.prototype.toString.call(temp).toLowerCase() == '[object array]'
  }
}

const validator = new JxValidator()
export default validator
